#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <ctime>



/*****定义*****/
struct Node
{
    int data;
    struct Node *next;
};
typedef struct Node Node;
typedef struct Node *LinkList;



/*****核心功能函数*****/
int GetMax(LinkList L)
{
    LinkList max, p;
    if (L->next == NULL)
        return NULL;
    max = L->next;     // max指向第一个具有实际意义的结点（除了头结点以外的第一个结点）
    p = L->next->next; // p指向max后面的一个结点

    while (p) // 若p的下一个结点存在，则进入循环
    {
        if (p->data > max->data)
            max = p; // 如果p的值大于pmax的值，则把p现在的地址赋值给max
        p = p->next; // 遍历链表
    }
    return max->data;
}



/*****随机生成单链表*****/
LinkList List_TailInsert(int l, LinkList &L) // 随机生成一个长度为l的单链表（未排序并且有头结点）
{
    int k = 1;
    int x = 0;
    L = (LinkList)malloc(sizeof(Node)); // 创建头结点
    LinkList s;
    LinkList r = L; // r为表尾指针
    while (k <= l)
    {
        x = rand() % 101;
        s = (LinkList)malloc(sizeof(Node)); // 由系统生成一个Node型的结点，同时将该结点的起始位置赋值给指针变量s
        s->data = x;
        r->next = s;
        r = s;
        k = k + 1;
        printf("%d ", x);
    }
    r->next = NULL;
    printf("\n");
    return L;
}



/*****主函数*****/
int main()
{
    //生成一个单链表
    LinkList L = NULL;
    srand(time(0));
    printf("生成的单链表：");

    //执行功能函数
    L = List_TailInsert(12, L);

    //输出最大值
    printf("      最大值：%d\n", GetMax(L));
    
    //防止运行后自动退出，需头文件【stdlib.h】
    system("pause"); 
}